import pylab as p 
import constants as c
import utils as u

#------------------------------------------------
# Funciones 
#------------------------------------------------   
def getTemplateWindow(click, len_segment):
    # Determinar los limites de la plantilla
    np_start = click - c.NP_WIDTH / 2
    np_end = click + c.NP_WIDTH / 2
        
    # Ajustar los valores de la plantilla en los casos de bordes.
    # Para cualquiera de estos dos caso puede suceder que el "click" ya no se encuentre centrado
    if np_start < 0:
        np_start = 0
        np_end = np_start + c.NP_WIDTH
    if np_end > len_segment:
        np_end = len_segment
        np_start = np_end - c.NP_WIDTH
        
    return [np_start, np_end]
    
def getPreviousWindow(np_start, np_end):
    # Determinar los limites de las ventanas de busqueda
    # Ventana de busqueda anterior
    prev_win_end = np_start - 1
    prev_win_start = prev_win_end - c.NW_WIDTH
    
    if (prev_win_start < 0) and (prev_win_end <= 0):
        # Primero verificar si se esta al comienzo del array de datos
        u.Log("El click se encuentra al principio del array de datos. Abortar calculo de ventana previa", 0)
        prev_win_start = -1
        prev_win_end = -1
    elif (prev_win_start < 0) and (prev_win_end > 0):
        # Ahora verificar si es necesario reajustar la ventana
        u.Log("No entra una ventana entera antes de la plantilla. Reajustando valor win_start", 0)
        prev_win_start = 0
    
    if ((prev_win_end - prev_win_start) < c.NP_WIDTH):
        u.Log("No entra una plantilla en la ventana previa. Abortar calculo de ventana previa", 0)
        prev_win_start = -1
        prev_win_end = -1
    
    return [prev_win_start, prev_win_end]

def getPosteriorWindow(np_start, np_end, len_segment):
    # Ventana de busqueda posterior
    post_win_start = np_end + 1
    post_win_end = post_win_start + c.NW_WIDTH
        
    if (post_win_start >= len_segment) and (post_win_end > len_segment):
        # Verificar si esta al final del array de datos
        u.Log("El click se encuentra al final del array de datos. Abortar calculo de ventana posterior", 0)
        post_win_start = -1
        post_win_end = -1
    elif (post_win_start < len_segment) and (post_win_end > len_segment):
        # Verificar si es necesario reajustar la ventana
        u.Log("No entra una ventana entera antes de la plantilla. Reajustando valor win_end", 0)
        post_win_end = len_segment
    
    if ((post_win_end - post_win_start) < c.NP_WIDTH):
        u.Log("No entra una plantilla en la ventana posterior. Abortar calculo de ventana posterior", 0)
        post_win_start = -1
        post_win_end = -1
    
    return [post_win_start, post_win_end]

# Obtener el segmento que se va a usar para tener un empalme suave
def getSmoothSegment(original, replacement):
    segment = []

    # Recorrer y calcular la correlacion entre ambas ventanas
    for i in xrange(len(original)):
        point = int(replacement[i] * c.WINDOW[i] + original[i] * (1 - c.WINDOW[i])) 
        segment.append(point)
        
    return segment


# Obtener el array de correlaciones para la ventana de busqueda
def getCorrelationArray(segment, np_start, np_end, win_start, win_end):
    corr_array = []
    
    # Verificar la condicion en los bordes. Puede suceder que no entre una ventana antes o despues de la plantilla
    # Verificar luego del ajuste si entra por lo menos una plantilla entera, sino descartar
    if (win_end - win_start) >= c.NP_WIDTH:
        # Obtener la correlacion para cada una de los posibles remplazos, verificando si 
        for i in xrange(0, (win_end - win_start) - c.NP_WIDTH):
            correlation = p.correlate(segment[np_start : np_end], segment[win_start + i : win_start + c.NP_WIDTH + i])  
            corr_array.append(correlation) 
    
    return corr_array

def getSAD(template, window):
    sad = 0
             
    # Recorrer y calcular la diferencia absoluta entre ambas ventanas
    for i in xrange(len(template)):
        sad += p.abs(int(template[i]) - int(window[i]))
        
    return sad
